#ifndef SYS_TSS_H
#define SYS_TSS_H

#include <yonex/types.h>

typedef struct
{
    unsigned short limit_low;      // 段界限 0~15位
    unsigned int base_low : 24;    // 基地址 0~24位
    unsigned char type : 4;        // 段类型
    unsigned char segment : 1;     // 1表示代码段或数据段，0表示系统段
    unsigned char DPL : 2;         // 描述符特权级 Descriptor Privilege Level
    unsigned char present : 1;     // 存在位: 1在内存上，0在磁盘上
    unsigned char limit_hign : 4;  // 段界限 16~19位
    unsigned char available : 1;   // 保留
    unsigned char long_mode : 1;   // 64位扩展标志
    unsigned char big : 1;         // 1表示32位，0表示16位
    unsigned char granularity : 1; // 1表示粒度为4K，0表示粒度为1B
    unsigned char base_mid;        // 基地址 25~31位
    unsigned int base_high;        // 基地址 32~63位
    unsigned int reserved;         // 保留
} __attribute__((packed)) tss_descriptor_t;

void tss_init();

void set_tss64(u64 rsp0, u64 rsp1, u64 rsp2,
    u64 ist1, u64 ist2, u64 ist3, u64 ist4,
    u64 ist5, u64 ist6, u64 ist7);

#endif
